#include <AT91SAM7S256.h>
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
#include <queue.h>
#include "Globales.h"
#include "Procesamiento.h"
#include "ADC.h"
#include "Tareas.c"
#include "Colas.h"
#include "LCD.h"

void Procesamiento_Setup(void) {
	ADC_Setup();

	//Inicializar el RTT 47923200
	AT91F_RTTC_CfgPMC();

	AT91C_BASE_RTTC->RTTC_RTMR = AT91C_RTTC_RTTRST | 0x8000;

}

void Procesamiento_LecturaDato(void) {
	short dato1;
	DatoADC datoADC;
	//while (1) {
	dato1 = ADC_LeerDato(4); // lee dato del canal 4
	datoADC.datoTemperatura = dato1;
	dato1 = ADC_LeerDato(5);
	datoADC.datoMetano = dato1;

	xQueueSend(colaEditorEscala, (void *) &datoADC, portMAX_DELAY);

	//}
}

void Procesamiento_EdicionEscala(short* voltaje, short* ppm) {
	DatoEditado datoEditado;
	DatoADC datoADC;
	char escalaTemp;
	char escalaMetano;
	char NUMERO_RANGOS = 19;
	int PENDIENTE_TEMP = 322;
	int OFFSET_TEMP = 60000;
	int resultado;
	while (1) {
		xQueueReceive(colaEditorEscala, &datoADC, portMAX_DELAY);

		resultado = (datoADC.datoTemperatura) * PENDIENTE_TEMP + OFFSET_TEMP;

		datoEditado.datoTemperatura = (short) (resultado / 100);

		if (datoADC.datoMetano < voltaje[0]) {
			datoEditado.datoMetano = 0;
		} else if (datoADC.datoMetano > voltaje[NUMERO_RANGOS - 1]) {
			datoEditado.datoMetano = ppm[NUMERO_RANGOS - 1];
		} else {
			short dif;
			char var;
			int n1, n2;
			for (var = 1; var < NUMERO_RANGOS; var++) {
				if (voltaje[var] > datoADC.datoMetano)
					break;
			}

			dif = voltaje[var] - voltaje[var - 1];
			//datoEditado.datoMetano = dif;
			n1 = ppm[var] * (dif - voltaje[var] + datoADC.datoMetano);
			n2 = ppm[var - 1] * (dif - datoADC.datoMetano + voltaje[var - 1]);
			if (n2 > n1) {
				datoEditado.datoMetano = (short) ((n2 - n1) / dif);
			} else
				datoEditado.datoMetano = (short) ((n1 - n2) / dif);
		}
		xQueueSend(colaDistribucion, (void *) &datoEditado, portMAX_DELAY);
	}

}

void Procesamiento_DistribucionDatos(void) {

	DatoEditado datoDistribucion;
	DatoInterfaz interfaz;
	DatoEditado analisis;
	//DatoAlmacenamiento almacenamiento;
	DatoComunicaciones almacenamiento;
	char zona;
	char hora;
	char minutos;
	char segundos;
	long tiempo;

	while (1) {
		xQueueReceive(colaDistribucion, &datoDistribucion, portMAX_DELAY) ;

		zona = readZonaActual();
		analisis.datoMetano = datoDistribucion.datoMetano;
		analisis.datoTemperatura = datoDistribucion.datoTemperatura;

		tiempo = (AT91C_BASE_RTTC->RTTC_RTVR);
		segundos = tiempo % 60;
		tiempo /= 60;
		minutos = tiempo % 60;
		tiempo /= 60;
		hora = (char) (tiempo & 0xFF);
		//interfaz

		interfaz.datoMetano = datoDistribucion.datoMetano;
		interfaz.datoTemperatura = datoDistribucion.datoTemperatura;
		interfaz.hora = hora;
		interfaz.minuto = minutos;
		interfaz.segundos = segundos;

		// almacenamiento
		almacenamiento.datoMetano = datoDistribucion.datoMetano;
		almacenamiento.datoTemperatura = datoDistribucion.datoTemperatura;
		almacenamiento.hora = hora;
		almacenamiento.segundos = segundos;
		almacenamiento.minuto = minutos;
		almacenamiento.zona = zona;

		//envio a las colas
		//xQueueSend(colaAlmacenamiento, (void *) &almacenamiento, 1);
		xQueueSend(colaComunicaciones, (void *) &almacenamiento, 1);
		xQueueSend(colaInterfaz, (void *) &interfaz,portMAX_DELAY);
		xQueueSend(colaAnalisis, (void *) &analisis, 1);
		//vTaskDelay(300);
		//		LCD_WR_HORA(hora,minutos,segundos);
	}

}

void Procesamiento_Analisis(void) {
	short temperatura;
	short metano;
	short umbralMetano;
	short umbralTemperatura;
	char alarma;

	DatoEditado datoAnalisis;

	while (1) {

		xQueueReceive(colaAnalisis, &datoAnalisis, portMAX_DELAY);
		umbralMetano = 850;
		umbralTemperatura = 42480;
		metano = datoAnalisis.datoMetano;
		temperatura = datoAnalisis.datoTemperatura;
		if (metano >= umbralMetano){// || temperatura >= umbralTemperatura) {
			alarma = 1;
		} else
			alarma = 0;

		xQueueSend(colaAlarma, (void *) &alarma, portMAX_DELAY);
	}

	// TODO si el umbral pasa del 15% entonces genere alarma
}
